Make set_cairo_surface_size a vfunc on GdkWindowImpl
authorKristian Rietveld <kris@gtk.org>
Tue, 5 Oct 2010 13:21:40 +0000 (15:21 +0200)
committerKristian Rietveld <kris@gtk.org>
Tue, 5 Oct 2010 13:38:23 +0000 (15:38 +0200)
Note the special implementation of this method on GdkOffscreenWindow
that makes sure its current surface is not destroyed.

gdk/gdkinternals.h
gdk/gdkoffscreenwindow.c
gdk/gdkwindow.c
gdk/gdkwindowimpl.h
gdk/quartz/gdkdrawable-quartz.c
gdk/quartz/gdkwindow-quartz.c
gdk/win32/gdkdrawable-win32.c
gdk/win32/gdkwindow-win32.c
gdk/x11/gdkdrawable-x11.c
gdk/x11/gdkwindow-x11.c

index 9f2c4ca1838bfc61590483dff57e6a829f13364f..e2f45d5cf5713b4e08e7fedf5f54ad3b64cb8123 100644 (file)
@@ -495,10 +495,6 @@ void _gdk_display_pointer_info_foreach (GdkDisplay                   *display,
 void _gdk_window_invalidate_for_expose (GdkWindow       *window,
                                        cairo_region_t       *region);
 
-gboolean _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
-                                               int width,
-                                               int height);
-
 GdkWindow * _gdk_window_find_child_at (GdkWindow *window,
                                       int x, int y);
 GdkWindow * _gdk_window_find_descendant_at (GdkWindow *toplevel,
index ebbdcc773789421f48df4c62b3fff4399d8c0d66..dbacf952a308aa282c7bcf530125aa4a66c18418 100644 (file)
@@ -597,6 +597,18 @@ gdk_offscreen_window_translate (GdkWindow      *window,
   _gdk_window_add_damage (window, area);
 }
 
+static cairo_surface_t *
+gdk_offscreen_window_resize_cairo_surface (GdkWindow       *window,
+                                           cairo_surface_t *surface,
+                                           gint             width,
+                                           gint             height)
+{
+  /* No-op.  The surface gets resized in
+   * gdk_offscreen_window_move_resize_internal().
+   */
+  return surface;
+}
+
 /**
  * gdk_offscreen_window_set_embedder:
  * @window: a #GdkWindow
@@ -700,4 +712,5 @@ gdk_offscreen_window_impl_iface_init (GdkWindowImplIface *iface)
   iface->get_root_coords = gdk_offscreen_window_get_root_coords;
   iface->get_device_state = gdk_offscreen_window_get_device_state;
   iface->destroy = gdk_offscreen_window_destroy;
+  iface->resize_cairo_surface = gdk_offscreen_window_resize_cairo_surface;
 }
index e0ef633f373932439cc4c94fed2c92a80ce97b76..6801900f8acc09141813217187225e6041264a3f 100644 (file)
@@ -1018,14 +1018,17 @@ recompute_visible_regions_internal (GdkWindowObject *private,
       recompute_visible_regions_internal (private->parent, TRUE, FALSE, FALSE);
     }
 
-  if (private->cairo_surface &&
-      (!gdk_window_has_impl (private) ||
-       !_gdk_windowing_set_cairo_surface_size (private->cairo_surface,
-                                               private->width,
-                                               private->height)))
+  if (private->cairo_surface && gdk_window_has_impl (private))
     {
-      gdk_window_drop_cairo_surface (private);
+      GdkWindowImplIface *iface = GDK_WINDOW_IMPL_GET_IFACE (private->impl);
+
+      private->cairo_surface = iface->resize_cairo_surface (private->impl,
+                                                            private->cairo_surface,
+                                                            private->width,
+                                                            private->height);
     }
+  else if (private->cairo_surface)
+    gdk_window_drop_cairo_surface (private);
 }
 
 /* Call this when private has changed in one or more of these ways:
index a39ed3793d73f0428592808d1846f6c8ac4e1a73..1c9d81980b457f1d1f0b451dc0c252998212f2b3 100644 (file)
@@ -141,6 +141,11 @@ struct _GdkWindowImplIface
   void         (* destroy)              (GdkWindow       *window,
                                         gboolean         recursing,
                                         gboolean         foreign_destroy);
+
+  cairo_surface_t * (* resize_cairo_surface) (GdkWindow       *window,
+                                              cairo_surface_t *surface,
+                                              gint             width,
+                                              gint             height);
 };
 
 /* Interface Functions */
index b19913675b4954e55a57b6a91cfdee07c0f2b261..632f0cd0098760c5aea734bd7336366652c2fd4b 100644 (file)
@@ -32,15 +32,6 @@ typedef struct {
   CGContextRef  cg_context;
 } GdkQuartzCairoSurfaceData;
 
-gboolean
-_gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
-                                      int              width,
-                                      int              height)
-{
-  /* This is not supported with quartz surfaces. */
-  return FALSE;
-}
-
 static void
 gdk_quartz_cairo_surface_destroy (void *data)
 {
index 6a583476671317353858dc1ca8f40eaa54da7a9d..11d140fd91de4fb4fd8324fc8c09cbc95842faca 100644 (file)
@@ -1086,6 +1086,18 @@ _gdk_quartz_window_destroy (GdkWindow *window,
     }
 }
 
+static cairo_surface_t *
+gdk_window_quartz_resize_cairo_surface (GdkWindow       *window,
+                                        cairo_surface_t *surface,
+                                        gint             width,
+                                        gint             height)
+{
+  /* Quartz surfaces cannot be resized */
+  cairo_surface_destroy (surface);
+
+  return NULL;
+}
+
 void
 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
 {
@@ -2986,6 +2998,7 @@ gdk_window_impl_iface_init (GdkWindowImplIface *iface)
   iface->queue_antiexpose = _gdk_quartz_window_queue_antiexpose;
   iface->translate = _gdk_quartz_window_translate;
   iface->destroy = _gdk_quartz_window_destroy;
+  iface->resize_cairo_surface = gdk_window_quartz_resize_cairo_surface;
 }
 
 
index beafd7b227d550abb17d693ab7993f305513ae08..d2e0348adb885b9386538f1c1c103fabc9de5833 100644 (file)
@@ -228,15 +228,6 @@ gdk_win32_ref_cairo_surface (GdkDrawable *drawable)
   return impl->cairo_surface;
 }
 
-gboolean
-_gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
-                                      gint width,
-                                      gint height)
-{
-  // Do nothing.  The surface size is determined by the DC
-  return FALSE;
-}
-
 HGDIOBJ
 gdk_win32_drawable_get_handle (GdkDrawable *drawable)
 {
index 9869a8e19adfe68a057bc049a3d4b79bf40b209a..398be8dcb174502305baef6b44042a565b68f0bc 100644 (file)
@@ -744,6 +744,18 @@ _gdk_win32_window_destroy (GdkWindow *window,
   gdk_win32_handle_table_remove (GDK_WINDOW_HWND (window));
 }
 
+static cairo_surface_t *
+gdk_win32_window_resize_cairo_surface (GdkWindow       *window,
+                                       cairo_surface_t *surface,
+                                       gint             width,
+                                       gint             height)
+{
+  /* XXX: Make Cairo surface use DC clip */
+  cairo_surface_destroy (surface);
+
+  return NULL;
+}
+
 void
 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
 {
@@ -3299,6 +3311,7 @@ gdk_window_impl_iface_init (GdkWindowImplIface *iface)
   iface->queue_antiexpose = _gdk_win32_window_queue_antiexpose;
   iface->translate = _gdk_win32_window_translate;
   iface->destroy = _gdk_win32_window_destroy;
+  iface->resize_cairo_surface = gdk_win32_window_resize_cairo_surface;
 }
 
 gboolean
index 9214364caaa93fa24dc0b125147b5229336e2b91..21107166ea3cb541b6217cf3ee004222a2e726fe 100644 (file)
@@ -194,15 +194,6 @@ gdk_x11_cairo_surface_destroy (void *data)
   impl->cairo_surface = NULL;
 }
 
-gboolean
-_gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface,
-                                      int width,
-                                      int height)
-{
-  cairo_xlib_surface_set_size (surface, width, height);
-  return TRUE;
-}
-
 static cairo_surface_t *
 gdk_x11_create_cairo_surface (GdkDrawable *drawable,
                              int width,
index df634b6b6563c6ca3374303d9f6bfdc1968b6522..66494d6152bc1b3b6d3b111c4e312133bc654a76 100644 (file)
@@ -1028,6 +1028,17 @@ _gdk_x11_window_destroy (GdkWindow *window,
     }
 }
 
+static cairo_surface_t *
+gdk_window_x11_resize_cairo_surface (GdkWindow       *window,
+                                     cairo_surface_t *surface,
+                                     gint             width,
+                                     gint             height)
+{
+  cairo_xlib_surface_set_size (surface, width, height);
+
+  return surface;
+}
+
 void
 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
 {
@@ -5514,6 +5525,7 @@ gdk_window_impl_iface_init (GdkWindowImplIface *iface)
   iface->queue_antiexpose = _gdk_x11_window_queue_antiexpose;
   iface->translate = _gdk_x11_window_translate;
   iface->destroy = _gdk_x11_window_destroy;
+  iface->resize_cairo_surface = gdk_window_x11_resize_cairo_surface;
 }
 
 static Bool